#pragma once

#include "Edificio.h"
#include "Suelo.h"
#include "Grua.h"

#include <glutwindow.h>
#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp>

#include <Vista.h>
#include <vector>

#include "ShaderLoader.h"


class myWindow : public cwc::glutWindow
{
public:
	myWindow();

	virtual void OnRender(void);
	virtual void OnIdle();

	// When OnInit is called, a render context (in this case GLUT-Window) is already available!
	virtual void OnInit();

	virtual void OnResize(int w, int h);
	virtual void OnClose(void);
	virtual void OnMouseDown(int button, int x, int y);
	virtual void OnMouseUp(int button, int x, int y);
	virtual void OnMouseWheel(int nWheelNumber, int nDirection, int x, int y);

	virtual void OnKeyDown(int nKey, char cAscii);

	virtual void OnKeyUp(int nKey, char cAscii);

private:
	enum { VISTA_PERSPECTIVA =0, VISTA_SUELO, VISTA_CABINA };
	
    // Matrices de Bindeo
    glm::vec4 light_position;
    glm::vec3 light_intensity;
    glm::mat4 view_matrix;
	glm::mat4 projection_matrix;

	// Superficie del mundo
	Suelo m_suelo;
	ShaderLoader m_shaderSuelo;

	// Edificio
	Edificio m_edificio;

	// Grua
	Grua m_grua;
    
	// Pos x e y del mouse
	int mouse_x;
	int mouse_y;

	// Control del teclado
	bool tecla_w;
	bool tecla_s;
	bool tecla_a;
	bool tecla_d;

	// Vistas y Camaras
	int vista;

	Vista* v_persp;
	Vista* v_suelo;
	Vista* v_cabina;

	void actualizarVistaSuelo(char cAscii);
	void actualizarVistaCabina(char cAscii);
	void rotarVistaCabina(float angulo);
};